using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using SubsidiosBussinessLogic.DataAccess.Context;
using SubsidiosBussinessLogic.DataAccess.Interfaces;
using SubsidiosBussinessLogic.DataAccess.SqlServerRepository;
using SubsidiosBussinessLogic.Models;
using SubsidiosBussinessLogic.SubsidioExceptions;
using SubsidiosWebMvc.CommonData;

namespace SubsidiosWebMvc.Controllers
{
    public class BloqueController : Controller
    {
        private IBloqueRepository Repository { get; set; }
   
        #region .ctor
        public BloqueController(): this (new BloqueRepository(DataContextFactory.GetContext()))
        {
        }

        public BloqueController(IBloqueRepository repository)
        {
            Repository = repository;
        }
        #endregion 

        //
        // GET: /Bloque/

        public ActionResult Listar()
        {
            var bloques = Repository.GetBloques();
            return View("Listar", bloques);
        }

        //
        // GET: /Bloque/Details/5

        public ActionResult Detalles(int id)
        {
            var bloque = Repository.FindSingle(b => b.BloqueId == id);
            return View("Detalles", bloque);
        }

        //
        // GET: /Bloque/Create

        public ActionResult Crear()
        {
            Funcionario funcionario = new Funcionario();
            UpdateModel(funcionario);

            
            var bloque = Repository.CreateBloque();
            return View("Crear", bloque);
        } 

        //
        // POST: /Bloque/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Crear(FormCollection collection)
        {
            var bloque = Repository.CreateBloque();
            try
            {
                // TODO: Add insert logic here
                UpdateModel(bloque);
                Repository.SaveBloque();
                return RedirectToAction("Listar");
            }
            catch
            {
                return View(bloque);
            }
        }

        //
        // GET: /Bloque/Edit/5
 
        public ActionResult Editar(int id)
        {
            return View(Repository.FindSingle(b => b.BloqueId == id));
        }

        //
        // POST: /Bloque/Edit/5

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Editar(int id, FormCollection collection)
        {
            var bloque = Repository.FindSingle(b => b.BloqueId == id);
            try
            {
                // TODO: Add update logic here
                UpdateModel(bloque);
                Repository.SaveBloque();
                return RedirectToAction("Detalles", new{Id = bloque.BloqueId});
            }
            catch
            {
                return View(bloque);
            }
        }

        public ActionResult GridataFilter()
        {
            return Json(null);
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult GridataDelete(int id)
        {
            try
            {
                var bloque = Repository.FindSingle(b => b.BloqueId == id);
                Repository.DeleteBloque(bloque);
                return null;
            }
            catch (SubsidiosExceptions invalidOperationException)
            {
                return Content(invalidOperationException.Message);
            }
            catch (Exception)
            {
                return Content("Ocurrio un error al borrar");
            }
        }

        //todo: ver si junto todo en un solo metodo para atender a la grilla.
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult GridataAdd()
        {
            var bloque = Repository.CreateBloque();
            try
            {
                UpdateModel(bloque);
                Repository.SaveBloque();
                return null;
            }
            catch (SubsidiosExceptions invalidOperationException)
            {
                return Content(invalidOperationException.Message);
            }
            catch (Exception)
            {
                return Content("Ocurrio un error al insertar");
            }
            
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult GridataSave(int id)
        {
            var bloque = Repository.FindSingle(b => b.BloqueId == id);
            try
            {
                UpdateModel(bloque);
                Repository.SaveBloque();
                return null;
            }
            catch (SubsidiosExceptions invalidOperationException)
            {
                return Content(invalidOperationException.Message);
            }
            catch (Exception)
            {
                return Content("Ocurrio un error al guardar");
            }
           
        }

        public ActionResult GetBloques()
        {
            var bloques = Repository.GetBloques();
            string result = "";
            foreach (var bloque in bloques)
            {

                result += String.Format("{0}:{1};", bloque.BloqueId, bloque.Descripcion); 
            }
            
            return Content(result.TrimEnd(new char[] {';'}));
        }

        public ActionResult GridData(string sidx, string sord, int page, int rows, bool _search, string searchField, string searchOper, string searchString)
        {   
            var bloques = Repository.GetBloques();
            var jsonData = new JsonData { page = page, records = 3, rows = new List<Rows>() };
            var pageIndex = page - 1;
            jsonData.page = page;
            jsonData.records = bloques.Count();
            jsonData.total = (int)Math.Ceiling((float)jsonData.records / (float)rows);
            jsonData.rows = new List<Rows>();

            if (_search && searchString != "")
            {
                
                switch (searchField)
                {
                    case "BloqueId":
                        int n=0;
                        try
                        {
                             n = Convert.ToInt32(searchString);             
                        }
                        catch (Exception)
                        {
                            n = 0;
                        }
                        finally
                        {
                            bloques = bloques.Where(b => b.BloqueId == n);
                        }
                        
                        break;
                    case "Descripcion":
                        bloques = bloques.Where(b => b.Descripcion.Contains(searchString));
                        break;
                     
                }
            }
            else
            {
                switch (sidx)
                {
                    case "BloqueId":

                        bloques = sord == "asc" ? bloques.OrderBy(b => b.BloqueId).Skip(pageIndex * rows).Take(rows) : bloques.OrderByDescending(b => b.BloqueId).Skip(pageIndex * rows).Take(rows);
                        break;

                    case "Descripcion":
                        bloques = sord == "asc" ? bloques.OrderBy(b => b.Descripcion).Skip(pageIndex * rows).Take(rows) : bloques.OrderByDescending(b => b.Descripcion).Skip(pageIndex * rows).Take(rows);

                        break;
                }
            }

            foreach (var bloque in bloques)
            {

                jsonData.rows.Add(new Rows { id = bloque.BloqueId, cell = new string[] { bloque.BloqueId.ToString(), bloque.Descripcion } });

            }

            return Json(jsonData);
        }

        
 
    }
}
